<?php defined('_JEXEC') or die('Restricted access');

class jmcore{
	protected static $val;
	public static function set($v){ self::$val = $v; }
	public static function get(){ return self::$val; }


	//取得当前使用的模板的所有参数
	function get_tpara(){
		static $tpara;
		if(isset($tpara)) return $tpara;
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true);
		$sql->select('params');
		$sql->from('#__template_styles');
		$sql->where('client_id=0 and home=1');
		$db->setQuery($sql);
		if (!$db->query()) echo 'Fail : '.$db->getErrorMsg();
		$res = $db->loadResult();
		$p = new JRegistry;
		$p->loadString($res);
		$p2=$p->toArray();
		$n = (int)$p2['v_n'];
		$tpara = array();
		for ($i = 0; $i <= $n; $i++) {$tpara[$i] = trim($p2['v_'.$i]);}
		return $tpara;
	}

	/* 向数据表中添加记录数据
		参数一，数据表，例如：$tab = 'contact_details'
		参数二，要添加的记录的字段，例如：$arr_fd = array(name, con_position, email_to);
		参数三，要添加的数据的字符串部分，例如：$arr_str = array($name,$nm,$eml,$txt,$dt,$dt0,$dt0,'*');
		参数四，要添加的数据的数值部分，例如：$arr_int = array(1,$cid,$pb);	*/
	function data_add( $tab,$arr_fd, $arr_str=array(),$arr_int=array()){
		if(count($arr_str)>0){ foreach($arr_str as &$m) $m = '"'.$m.'"';}
		$arr_val = array_merge($arr_str,$arr_int);
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true);
		$sql->insert('#__'.$tab.' ('.implode(',', $arr_fd).')');
		$sql->values(implode(',', $arr_val));
		$db->setQuery($sql);
		$db->query();
		if($db->getErrorNum()){ echo $db->getErrorMsg().$sql; return false; }
		return $sql;
	}

	/* 删除数据表中数据  */
	function data_del($tab, $whe){
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true);
		$sql->delete('#__'.$tab);
		$sql->where($whe);
		$db->setQuery($sql);
		$db->query();
		if($db->getErrorNum()){ echo $db->getErrorMsg().$sql; return false; }
		return $sql;
	}

	/* 更新数据表中数据  */
	function data_upd($set, $tab, $whe =null){
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true);
		$sql->update('#__'.$tab);
		$sql->set($set);
		if($whe) $sql->where($whe);
		$db->setQuery($sql);
		$db->query();
		if($db->getErrorNum()){ echo $db->getErrorMsg().$sql; return false; }
		return $sql;
	}

	/* 从数据表中取数据
		$type：
		1 ---- 仅第一行第一个
		2 ---- 个数
		10 ---- 第一行（数组）
		11 ---- 第一行（对象）
		20 ---- 二维（数组）
		其它 ---- 二维（对象）
		例如：jmodata::get_data(0, '*','users', 'uid='.$uid, 'ordering < 10', 'ordering DESC'); */
	function get_data($type=0, $field='*', $tab='users', $whe =null, $ord = null, $key = null, $start=0, $limit=null){
		$tab = '#__'.$tab;
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true);
		$sql->select($field);
		$sql->from($tab);
		if($whe) $sql->where($whe);
		if($ord) $sql->order($ord);
		if($limit) $db->setQuery($sql, $start, $limit); else $db->setQuery($sql);

		if($type==2){ $db->query(); $res = $db->getNumRows();}
		elseif($type==1)	$res = $db->loadResult();
		elseif($type==10)	$res = $db->loadAssoc();
		elseif($type==11)	$res = $db->loadObject();
		elseif($type==20)	$res = $db->loadAssocList($key);
		else						$res = $db->loadObjectList($key);
		if($db->getErrorNum()){ echo $db->getErrorMsg().$sql; return false; }
		return $res ;
	}

	//从参数一中取参数二指定的字符数
	public static function get_text_limit($text=' ', $limit=1, $strip=true, $end='...'){
		if(!$text || !$limit) return ' ';
		if($strip) $text = strip_tags($text);

		if(JString::strlen($text)<=($limit+1)) return $text;
		return JString::substr($text, 0, $limit).$end;
	}

	/* 取文章，从content数据表中取内容的专用函数
		参数一，条件
		参数二，篇数
		参数三，排序方式
		参数四，字段
		参数五，数据表名，art—content，ctg—categories */
	public static function get_art($whe='',$n=0,$ordby=' id desc ',$sel='*',$from='content'){
		$db = JFactory::getDbo();	
		$sql = $db->getQuery(true);
		$sql->select($sel);
		if($from=='ctg')	$from = 'categories';
		$sql->from('#__'.$from);
		if($whe)		$sql->where($whe);
		if($ordby)	$sql->order($ordby);
		if($n)			$db->setQuery($sql,0,$n);	else $db->setQuery($sql);
		$res = $db->loadObjectList();
		if($db->getErrorNum()){ echo $db->getErrorMsg().$sql; return false; }
		return $res;
	}

	//取得所有模块，返回一个以模块id为键名的模块记录数组
	private static function _get_module(){
		static $modules;
		if (isset($modules)) return $modules;

		$app = JFactory::getApplication();
		$clientId = (int) $app->getClientId();
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true);
		$sql->select('m.id, m.title, m.module, m.position, m.content, m.showtitle, m.params');
		$sql->from('#__modules AS m');
		$sql->where('m.published = 1');
		$sql->where('m.client_id = ' . $clientId);
		$sql->order('m.ordering asc');
		$db->setQuery($sql);
		$res = $db->loadObjectList('id');
		if($db->getErrorNum()){ echo $db->getErrorMsg().$sql; return false; }
		$modules = $res;
		return $modules;
	}

	/* 显示指定模块的内容
		参数一，模块ID
		参数二，模块显示的类型
		例如：echo jmodata::show_mod(110);	*/
	public static function show_mod($id, $style='jcmod'){
		jimport('joomla.application.module.helper');
		$arr = self:: _get_module();
		$html = JModuleHelper::renderModule($arr[$id],array('style'=>$style));
		return $html ;
	}

	/* 显示指定类型的模块的内容
		参数一，模块类型，例如：mod_mjc2008
		参数二，是否显示所有同类型的模块
		参数三，模块显示的类型
		例如：echo jmcore::show_mod_type('mod_mjc2t4n10');	*/
	public static function show_mod_type($type,$all=false, $style='jcmod'){
		jimport('joomla.application.module.helper');
		$html = '';
		$arr = self:: _get_module();
		foreach($arr as $m){
			if($m->module==$type){
				$mod = JModuleHelper::renderModule($m,array('style'=>$style));
				if(!$all) return $mod;
				$html .=$mod;
			}
		}
		return $html ;
	}

	/* 显示指定位置的所有模块的内容
		参数一，模块位置
		参数二，模块显示的类型
		参数三，要不要考虑菜单指定，true，则再选定位置为 “menu_”的模块
		例如：echo jmodata::show_mod('jmod88');	*/
	public static function show_mod_pst($pst ,$menu=false, $style='jcmod'){
		if(!$pst) return null;
		jimport('joomla.application.module.helper');
		$html = '';
		$arr = self:: _get_module();
		foreach($arr as $m){
			if($m->position == $pst)
			$html .=JModuleHelper::renderModule($m,array('style'=>$style));
		}

		if($menu){
			$Itemid = JRequest::getInt('Itemid');
			$app = JFactory::getApplication();
			$clientId = (int) $app->getClientId();
			$db = JFactory::getDbo();
			$query = $db->getQuery(true);
			$query->select('m.id, m.title, m.module, m.position, m.content, m.showtitle, m.params, mm.menuid');
			$query->from('#__modules AS m');
			$query->join('LEFT', '#__modules_menu AS mm ON mm.moduleid = m.id');
			$query->where('m.client_id = ' . $clientId);
			$query->where(' m.published = 1 ');
			$query->where(' m.position = "menu_'.$pst.'" ');
			$query->where('(mm.menuid = ' . (int) $Itemid . ' OR mm.menuid <= 0)');
			$query->order('m.ordering asc');
			$db->setQuery($query);
			$modules = $db->loadObjectList();
			if ($db->getErrorNum()){
				JError::raiseWarning(500, JText::sprintf('JLIB_APPLICATION_ERROR_MODULE_LOAD', $db->getErrorMsg()));
				return $html ;
			}
			$clean = $dupes = array();
			$negId = $Itemid ? -(int) $Itemid : false;
			for ($i = 0, $n = count($modules); $i < $n; $i++){
				$module = &$modules[$i];

				$negHit = ($negId === (int) $module->menuid);
				if (isset($dupes[$module->id])){
					if ($negHit) unset($clean[$module->id]);
					continue;
				}
				$dupes[$module->id] = true;
				if (!$negHit) $clean[$module->id] = $module;
			}

			if(count($clean)>0){
			foreach($clean as $m){
				$html .=JModuleHelper::renderModule($m,array('style'=>$style));
			} }
		}
		return $html ;
	}


	/*取得中国时间类对象或指定时间的指定格式形成
		时间戳是全世界一样的，但具体的时间表现形式，在各时区不一样，本函数的主要功能是显示中国时间
		参数一，任何形式的时间。当前时间用 null 或 'now' 。
		参数二，时间格式。指定格式，则返回指定格式的时间；未指定格式，则返回时间类对象
		参数三，参数一是“格式化时间”，还是“时间戳”，缺省为“格式化时间”，如果参数一为“时间戳”，则这里一定要设置为“false”，否则会报错。
		参数四，时区，缺省为true，即上海时区。

		例如：$x = jmodata::get_dt_cn('2011-3-8','Y-m-d H:i:s');
		返回：2011-03-08 00:00:00

		例如：$x = jmodata::get_dt_cn(1369639912,10,false);
		返回：2013-05-27 15:31:52
		
		例如：$x = jmodata::get_dt_cn(null,7);
		返回：2013-05-26

		例如：$x = jmodata::get_dt_cn();
		返回：时间类对象，这个对象可以用不能显示，所以这时，如果“echo $x”，会报错。	*/
	public static function get_dt_cn($dt='now',$format=null,$dt_is_datetime=true,$txt_tz = 'Asia/Shanghai'){
		if(!$txt_tz) $txt_tz = 'Asia/Shanghai';
		$tz = new DateTimeZone($txt_tz);

		switch ($format) {
			case null:	return new DateTime('now',$tz);
			case 'tz':	return $tz;
			case 1:		$f = 'Y' ;	break;
			case 2:		$f = 'm' ;	break;
			case 3:		$f = 'd' ;	break;
			case 4:		$f = 'H' ;	break;
			case 5:		$f = 'i' ;		break;
			case 6:		$f = 's' ;	break;
			case 7:		$f = 'Y-m-d' ;	break;
			case 8:		$f = 'H:i:s' ;	break;
			case 9:		$f = 'U' ;		break;
			case 10:		$f = 'Y-m-d H:i:s' ;	break;
			default:		$f = $format;
		}

		if($dt_is_datetime){
			$dt = new DateTime($dt,$tz);
			return $dt ->format($f);
		}else{
			//用时间类转换时间戳，php5.1以上结果会与实际时间相差8小时，解决办法是用date_default_timezone_set()，设好时区，再用data()来转换
			date_default_timezone_set($txt_tz);
			return date($f,$dt);
		}
	}
}
?>